package ar.edu.utn.frba.dds.aterrizar.aerolineas;

import java.util.ArrayList;

import com.lanchita.excepciones.CodigoErroneoException;

import ar.edu.utn.frba.dds.aterrizar.busquedas.*;
import ar.edu.utn.frba.dds.aterrizar.mocks.MockAerolineaLanchita;
import ar.edu.utn.frba.dds.aterrizar.usuarios.Usuario;

public class AerolineaLanchitaAdapter extends AerolineasInterface {

	private static MockAerolineaLanchita thisAerolinea;

	public AerolineaLanchitaAdapter(MockAerolineaLanchita mock) {
		thisAerolinea = mock;
	}
	
	protected void comprarElVuelo(Vuelo vuelo, Usuario usuario) {
		thisAerolinea.comprar(vuelo.getCodigoDeVuelo()+"-"+vuelo.getCodigoDeAsiento());
	}
	
	protected void reservarElVuelo(Vuelo vuelo, Usuario usuario) {
		thisAerolinea.reservar(vuelo.getCodigoDeVuelo()+"-"+vuelo.getCodigoDeAsiento(), usuario.getDNI());
	}
	
	public ArrayList<Vuelo> getAsientosTotales() {
		String[][] asientosTotales = thisAerolinea.asientos(null, null, null, null, null, null);
		return getVuelosComoArray(asientosTotales);
	}

	public ArrayList<Vuelo> getAsientosBuscados(Busqueda busqueda) {
		String[][] asientosBuscados = thisAerolinea.asientosDisponibles(
				busqueda.getOrigen(), busqueda.getDestino(),
				busqueda.getRangoFechas().getFechaSalida(), busqueda.getRangoFechas().getFechaLlegada(),
				busqueda.getRangoFechas().getHoraSalida(), busqueda.getRangoFechas().getHoraLlegada());
		return getVuelosComoArray(asientosBuscados);
	}
	
	public ArrayList<Vuelo> getAsientosBuscadosIncluyendoReservados(Busqueda busqueda) {
		ArrayList<Vuelo> vuelosBuscados = new ArrayList<Vuelo>();
		for(Vuelo vuelo : getAsientosTotales()) {
			if(coincideConElBuscado(vuelo, busqueda)) {
				vuelosBuscados.add(vuelo);
			}
		}
		return vuelosBuscados;
	}
	
	public boolean coincideConElBuscado(Vuelo vuelo, Busqueda busqueda) {
		String origen = busqueda.getOrigen();
		if(origen != null && !origen.equals(vuelo.getAeroOrigen())){
			return false;
		}
		String destino = busqueda.getDestino();
		if(destino != null && !destino.equals(vuelo.getAeroDestino())){
			return false;
		}
		String fechaSalida = busqueda.getRangoFechas().getFechaSalida();
		if(fechaSalida != null && !fechaSalida.equals(vuelo.getFechaSalida())){
			return false;
		}
		String horaSalida = busqueda.getRangoFechas().getHoraSalida();
		if(horaSalida != null && !horaSalida.equals(vuelo.getHorarioSalida())){
			return false;
		}
		String fechaLlegada = busqueda.getRangoFechas().getFechaLlegada();
		if(fechaLlegada != null && !fechaLlegada.equals(vuelo.getFechaLlegada())){
			return false;
		}
		String horaLlegada = busqueda.getRangoFechas().getHoraLlegada();
		if(horaLlegada != null && !horaLlegada.equals(vuelo.getHorarioLlegada())){
			return false;
		}
		return true;
	}
	
	public String quienSoy()
	{
		return "Lanchita";
	}
	
	public ArrayList<Vuelo> getVuelosComoArray(String[][] vuelos) {
		ArrayList<Vuelo> aux = new ArrayList<Vuelo>();
		for(String[] unVuelo : vuelos){
			aux.add(crearVuelo(unVuelo));
		}
		return aux;
	}
	
	private String[] getCodigoDeVueloYDeAsiento(String codigoCompleto) {
		String[] codigos = codigoCompleto.split("-");
		return codigos;
	}
	
	public Vuelo crearVuelo(String[] unVuelo) {
		String[] codigos = getCodigoDeVueloYDeAsiento(unVuelo[0]);
		return new Vuelo(codigos[0], codigos[1], unVuelo[1], unVuelo[2], unVuelo[3], unVuelo[4], unVuelo[5], unVuelo[6], unVuelo[7], unVuelo[8], unVuelo[9], unVuelo[10], unVuelo[11], this);
	}

	@Override
	public Vuelo encontrarVueloPorCodigo(Vuelo oVuelo) 
	{
		ArrayList<Vuelo> vuelos = this.getAsientosTotales();
		for(Vuelo vuelo : vuelos) {
			if((vuelo.getCodigoDeVuelo()+"-"+vuelo.getCodigoDeAsiento()/*no se xq parte del cod de asiento esta cn el cod de vuelo*/).equalsIgnoreCase(oVuelo.getCodigoDeAsiento()))
			{
				return vuelo;
			}
		}
		throw new CodigoErroneoException(oVuelo.getCodigoDeAsiento());
	}
	@Override
	public ArrayList<Vuelo> getReservasPorUsuario(Usuario usuario) 
	{
		return buscarPorEstadoYDNI(usuario, "R");
	}
	@Override
	public ArrayList<Vuelo> getComprasPorUsuario(Usuario usuario) 
	{
		return buscarPorEstadoYDNI(usuario, "C");
	}
	/*
	 * se hizo porque en el modulo de busqueda no estaba contemplado buscar por dni de usuario
	 * */
	private ArrayList<Vuelo> buscarPorEstadoYDNI(Usuario usuario, String estado)
	{
		ArrayList<Vuelo> vuelosBuscados = new ArrayList<Vuelo>();
		String[][] asientosBuscadosArray = thisAerolinea.asientos(null, null, null, null, null, null);
		for (String[] asientoArray : asientosBuscadosArray) {
			if(asientoArray[4] == estado && asientoArray[5] == usuario.getDNI()) // 5 -> DNI , 4 -> Estado
			{
				vuelosBuscados.add(crearVuelo(asientoArray));
			}
		}
		return vuelosBuscados;
	}
}
